home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
C/C++ Users Group Library 1996 July
/
C-C++ Users Group Library July 1996.iso
/
vol_300
/
344_01
/
mtxsolv.c
< prev
next >
Wrap
Text File
|
1991-05-27
|
2KB
|
81 lines
/*-----------------------------------------------------------------------
Main File : mtx.exe
File Name : mtxsolv.c
Purpose - G-J computations on an A|b matrix
-------------------------------------------------------------------------*/
#include "mtx.h"
#include "mtxcle.h"
/* Indexing macro for temporary array */
#define Pivot(i) *(pivot+(i))
extern int MSize;
/* Head pointers */
Mtype *Aptr=NULL;
Mtype *bptr=NULL;
void dswap(Mtype *p1, Mtype *p2)
{
Mtype temp;
temp=*p1;
*p1=*p2;
*p2=temp;
}
void solve_matrix()
{
int i,j,k;
const long int n = MSize;
Mtype *pivot,mabs,mmax,prod,sum;
if((pivot=(Mtype *)alloc(n,sizeof(Mtype)))==NULL)
error(errHISIZE);
for(k=0; k < n-1; ++k)
{
Pivot(k) = k;
mmax = (Mtype)absMtype(A(k,k));
for(i=k+1; i < n; ++i)
{
mabs = (Mtype)absMtype(A(i,k));
if(mabs > mmax)
{
Pivot(k) = i;
mmax = mabs;
}
}
if(mmax == 0)
error(errSINGULARITY);
if(Pivot(k) != k)
{
i = Pivot(k);
dswap(bptr+k, bptr+i);
for(j=k; j < n ; ++j)
dswap(Aptr+(k*n)+j, Aptr+(i*n)+j);
}
for(i=k+1; i < n; i++)
{
prod = A(i,k) / A(k,k);
A(i,k) = prod;
b(i) -= prod * b(k);
for(j=k+1; j < n; ++j)
A(i,j) -= prod * A(k,j);
}
}
if(A(n-1,n-1) == 0)
error(errSINGULARITY);
for(i=n-1; i >= 0; --i)
{
for(sum=0.0, j=i+1; j < n; ++j)
sum += A(i,j) * b(j);
b(i) = (b(i)-sum) / A(i,i);
}
}